class Solution {
public:
    bool hasAllCodes(string s, int k) {
        int n=s.size();
        if(n<(1<<k)-1+k) return false;
        unordered_set<string> exist;
        for(int i=0;i+k<=n;++i)
        {
            exist.insert(move(s.substr(i,k)));
        }
        return exist.size()==(1<<k);
    }
    // bool hasAllCodes(string s, int k) {
    //     int n=s.size();
    //     if(n<(1<<k)-1+k) return false;
    //     int num=stoi(s.substr(0,k),nullptr,2);
    //     unordered_set<int> exist={num};
    //     for(int i=1;i+k<=n;++i)
    //     {
    //         num=(num-((s[i-1]-'0')<<(k-1)))*2+(s[i+k-1]-'0');
    //         exist.insert(num);
    //     }
    //     return exist.size()==(1<<k);
    // }
};